package de.hm.edu.kinderfinder.activities;

import java.util.Calendar;
import java.util.List;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import de.hm.edu.kinderfinder.contentprovider.DataBaseManager;
import de.hm.edu.kinderfinder.location.CircleOverlay;
import de.hm.edu.kinderfinder.location.MapOverlayItems;
import de.hm.edu.kinderfinder.pojos.LocationObject;
import de.hm.edu.kinderfinder.pojos.ZoneObject;

/**
 * Diese Activity stellt die Kartenrepräsentation der Applikation dar. In ihr
 * kann die Position des Kindes aktiv abgebfragt und angezeigt werden
 * 
 * @author Lukas Jarosch, Christoph-Samuel Pitter
 * 
 */
public class MapViewActivity extends MapActivity {

	private static final String NO_NUMBER_DEFINED = "NO_NUMBER";
	private MapOverlayItems itemizedoverlay;
	private List<Overlay> mapOverlays;
	private MapView mapView;
	private static boolean isRunning;

	/**
	 * Gibt an die Activity schon läuft.
	 * Wenn nicht soll sie auch nicht auf gehen.
	 * @return boolean ob die Activity läuft
	 */
	public static boolean isRunning() {
		return isRunning;
	}

	/**
	 * Wird aufgerufen wenn die Activity erzeugt wird, erster Schritt im 
	 * Lifecycles von Activities. Weiter sind onPause, onResume und onDestroy
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mapview_position);
		mapView = (MapView) findViewById(R.id.mapview_ortung);

		mapView.setBuiltInZoomControls(false);
		mapView.setClickable(true);
		mapView.setEnabled(true);

		mapView.setScrollbarFadingEnabled(true);
		mapOverlays = mapView.getOverlays();
		Drawable drawable = this.getResources()
				.getDrawable(R.drawable.map_blue);
		itemizedoverlay = new MapOverlayItems(drawable, this);

		// read loc from DB
		SharedPreferences prefs = getSharedPreferences("Location", MODE_PRIVATE);
		float latitude = prefs.getFloat("latitude", 0);
		float longitude = prefs.getFloat("longitude", 0);
		long timeMilSec = prefs.getLong("time", 0);
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(timeMilSec);
		drawZones();
		((TextView) (findViewById(R.id.tvUpdateContent))).setText(cal.getTime()
				.toGMTString());

		GeoPoint point2 = new GeoPoint((int) (longitude * 1E6),
				(int) (latitude * 1E6));

		OverlayItem overlayItemDebug = new OverlayItem(point2, "Klein Stefan",
				"Hat sich verlaufen!");
		itemizedoverlay.addOverlay(overlayItemDebug);

		mapOverlays.add(itemizedoverlay);
		mapView.getController().animateTo(point2);

	}

	/**
	 * Hier werden die eingehenden Intents aufgefangen die ausgelöst werden wenn
	 * vom BroadCastReciever eine Location and die Mapview weitergeleitet wird
	 * um sie anzuzeigen falls die App schon läuft.
	 * 
	 * @param Intent mit den Informationen.
	 */
	@Override
	public void onNewIntent(Intent newIntent) {
		super.onNewIntent(newIntent);
		// update interface info
		SharedPreferences prefs = getSharedPreferences("Location", MODE_PRIVATE);
		long timeMilSec = prefs.getLong("time", 0);
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(timeMilSec);

		((TextView) (findViewById(R.id.tvUpdateContent))).setText(cal.getTime()
				.toGMTString());

		// erst liste von alten overlays leeren
		itemizedoverlay.clarOverlays();

		// neues overlay rein tun
		LocationObject dataObj = (LocationObject) newIntent.getExtras()
				.getSerializable("Data");

		GeoPoint point2 = new GeoPoint((int) (dataObj.getAtt() * 1E6),
				(int) (dataObj.getLatt() * 1E6));

		OverlayItem overlayitem2 = new OverlayItem(point2, "Klein Stefan",
				"Hat sich verlaufen!");
		itemizedoverlay.addOverlay(overlayitem2);
		itemizedoverlay.populateOverlays();
		mapView.getController().animateTo(point2);
	}

	@Override
	protected void onPause() {
		super.onPause();
		isRunning = false;
	}

	@Override
	protected void onResume() {
		super.onResume();
		isRunning = true;
	}

	/**
	 * Diese Methode wird ausgelöst wenn der User angibt zur Zielperson
	 * navigiert werden zu wollen. Sie erstellt einen Intent mit den Koordinaten
	 * und leitet es ans System weiter.
	 * 
	 * @param v
	 */
	public void navigation(View v) {

		SharedPreferences prefs = getSharedPreferences("Location", MODE_PRIVATE);
		float lat = new Float(prefs.getFloat("latitude", 0));
		float lon = new Float(prefs.getFloat("longitude", 0));
		String directions = "http://maps.google.com/maps?daddr=" + lon + ","
				+ lat;
		Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
		intent.setData(Uri.parse(directions));
		startActivity(intent);
	}

	/**
	 * Diese Methode wird ausgelöst wenn der User angibt das er eine aktives
	 * Update über die Positon der Zielperson haben möchte. Es wird eine SMS an
	 * das GeoCare Gerät mit deröAnfrage versendet.
	 * 
	 * @param v
	 */
	public void sendUpdateRequest(View v) {
		SharedPreferences prefs = PreferenceManager
				.getDefaultSharedPreferences(getBaseContext());
		String nr = prefs.getString("telnr", NO_NUMBER_DEFINED);
		if (nr.equalsIgnoreCase(NO_NUMBER_DEFINED)) {
			Toast.makeText(
					this,
					"Bitte zuerst die Telefonnummer in den Einstellungen setzten",
					Toast.LENGTH_LONG).show();
		} else {
			sendSms(nr, "position");
		}
	}

	/**
	 * Methode zum Senden von SMS.
	 * @param number
	 *            Telefonnummer des Empfängers.
	 * @param message
	 *            zu sendene Nachricht.
	 */
	private void sendSms(String number, String message) {
		SmsManager smsManager = SmsManager.getDefault();
		smsManager.sendTextMessage(number, null, message, null, null);
	}

	/**
	 * Holt sich alle Methoden aus der Datenbank fügt sie einzeln der Mapview
	 * hinzu.
	 */
	private void drawZones() {
		DataBaseManager database = DataBaseManager.getInstance(this);
		List<ZoneObject> zones = database.getZonesFromDB();
		for (ZoneObject zone : zones) {
			makeNewZone(zone);
			Log.i("pk", zone.getRadius() + " add zone " + zone.getZonename());
		}
	}

	/**
	 * Hier werden die eigentlichen graphischen Zonenrepräsentation generiert
	 * und über die Mapview gelegt.
	 * 
	 * @param zone
	 *            die erstellt werden soll
	 */
	private void makeNewZone(ZoneObject zone) {
		CircleOverlay circle = new CircleOverlay(this, zone.getLongitude(),
				zone.getLatitude(), zone.getRadius());
		mapOverlays.add(circle);

	}

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
}
